<%# The license inside this block applies to this file.
# Copyright 2017 Google Inc.
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
-%>
<%
  # This template file generates both NestedObjects + Arrays of NestedObjects.
  nested_property = if property.is_a?(Api::Type::Array)
                    property.item_type
                  else
                    property
                  end
  class_name = qualified_property_class(nested_property).camelize(:upper)
  product_ns = product.name.camelize(:upper)
-%>
# frozen_string_literal: false

<%= lines(autogen_notice(:ruby, pwd)) -%>
<%
  requires = generate_requires(nested_property.nested_properties)
-%>
<%= lines(emit_requires(requires)) -%>
module GoogleInSpec
  module <%= product_ns %>
    module Property
      class <%= class_name -%>
<% if property.nested_properties? -%>
<% property.nested_properties.each do |prop| -%>

        attr_reader :<%= prop.out_name %>
<% end # property.nested_properties.each -%>

<% end # if property.nested_properties? -%>
        def initialize(args = nil, parent_identifier = nil)
          return if args.nil?
          @parent_identifier = parent_identifier
<% property.nested_properties.each do |prop| -%>
<%
  parse_code = "@#{prop.out_name} = #{parse_code(prop, 'args')}"
-%>
<%= lines(indent(parse_code, 10)) -%>
<% end # property.nested_properties.each -%>
        end

        def to_s
          "#{@parent_identifier} <%= class_name -%>"
        end
<% if time_prop?(property.nested_properties) -%>

        # Handles parsing RFC3339 time string
        def parse_time_string(time_string)
          time_string ? Time.parse(time_string) : nil
        end
<% end # has_time_prop -%>
      end
<% if property.is_a?(Api::Type::Array) -%>

      class <%= class_name %>Array
        def self.parse(value, parent_identifier)
          return if value.nil?
          return <%= class_name %>.new(value, parent_identifier) unless value.is_a?(::Array)
          value.map { |v| <%= class_name %>.new(v, parent_identifier) }
        end
      end
<% end #if property is Array -%>
    end
  end
end
